﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using EFramework.Web.TypeExtension;

namespace  RzCorportativo.Views.Cadastros
{
    public partial class Agendamento : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;
            this.LoadScreen();
        }

        private void LoadScreen()
        {
            var lista = RzCorportativo.Lib.Especialidade.Listar(new RzCorportativo.Lib.Especialidade());
            lista.Insert(0, new RzCorportativo.Lib.Especialidade() { EspecialidadeId = 0, Descricao = "Especialidade" });
            this.EspecialidadeId.DataSource = lista;
            this.EspecialidadeId.DataTextField = "Descricao";
            this.EspecialidadeId.DataValueField = "EspecialidadeId";
            this.EspecialidadeId.DataBind();

            var medicos = new List<RzCorportativo.Lib.Medico>();
            medicos.Add(new RzCorportativo.Lib.Medico()
            {
                MedicoId = 0,
                Pessoa = new RzCorportativo.Lib.Usuario() { Nome = "Medico" }
            });
            this.MedicoId.DataSource = medicos.Select(m => new { MedicoId = m.MedicoId, Nome = m.Pessoa != null ? m.Pessoa.Nome : string.Empty }).ToList();
            this.MedicoId.DataTextField = "Nome";
            this.MedicoId.DataValueField = "MedicoId";
            this.MedicoId.DataBind();
        }

        protected void salvar_Click(object sender, EventArgs e)
        {
            string msg = "";
            bool sucesso = false;
            Alert alert = new Alert("erroGeral", this);
            alert.AlertType = AlertType.Error;
            try
            {
                RzCorportativo.Lib.Agenda agendamento = new RzCorportativo.Lib.Agenda();
                agendamento.DataConsulta = DateTimeExtension.Parse(this.DataConsulta.Text, DateTime.MinValue);
                agendamento.EspecialidadeId = ShortExtension.Parse(this.EspecialidadeId.SelectedValue, 0);
                agendamento.MedicoId = IntExtension.Parse(this.Request[this.MedicoId.UniqueID], 0);
                agendamento.PacienteId = IntExtension.Parse(this.PacienteId.Text, 0);
                if (agendamento.MedicoId != 0)
                {
                    var dataSource = RzCorportativo.Lib.Medico.Listar(new RzCorportativo.Lib.Medico() { Especialidade = agendamento.EspecialidadeId });
                    if (dataSource.Count > 0)
                    {
                        dataSource.Add(new RzCorportativo.Lib.Medico() { MedicoId = 0, Pessoa = new RzCorportativo.Lib.Usuario() { Nome = "Selecione" } });
                        this.MedicoId.DataSource = dataSource.Select(s => new { MedicoId = s.MedicoId, Nome = s.Pessoa != null ? s.Pessoa.Nome : string.Empty }).ToList();
                        this.MedicoId.DataValueField = "MedicoId";
                        this.MedicoId.DataTextField = "Nome";
                        this.MedicoId.DataBind();
                        if (dataSource.Exists(a => a.MedicoId == agendamento.MedicoId)) 
                            this.MedicoId.SelectedValue = agendamento.MedicoId.ToString();
                    }
                }
                TimeSpan time = TimeSpan.MinValue;
                if (TimeSpan.TryParse(this.HoraInicio.Text, out time))
                    agendamento.HoraInicio = time;
                else
                    agendamento.HoraInicio = TimeSpan.MinValue;
                if (TimeSpan.TryParse(this.HoraSaida.Text, out time))
                    agendamento.HoraFim = time;
                else
                    agendamento.HoraFim = TimeSpan.MinValue;
                if (agendamento.PacienteId == 0)
                {
                    alert.Add("pacienteInvalido", "Paciente inválido");
                }
                if (agendamento.DataConsulta == DateTime.MinValue)
                {
                    alert.Add("dataConsulta", "Data de consulta inválida");
                }
                if (agendamento.HoraInicio == TimeSpan.MinValue)
                {
                    alert.Add("horaInicio", "Hora de entrada inválida");
                }
                if (agendamento.HoraFim == TimeSpan.MinValue)
                {
                    alert.Add("horaSaida", "Hora de saída inválida");
                }
                if (agendamento.HoraFim < agendamento.HoraInicio)
                {
                    alert.Add("saidaEntrada", "Hora de saída não pode ser menor que hora da entrada");
                }
                if (agendamento.EspecialidadeId == 0)
                {
                    alert.Add("especialidade", "Especialidade inválida");
                }
                if (agendamento.MedicoId == 0)
                {
                    alert.Add("medico", "Médico inválido");
                }
                var agendas = RzCorportativo.Lib.Agenda.Listar(new RzCorportativo.Lib.Agenda()
                {
                    DataConsulta = agendamento.DataConsulta,
                    MedicoId = agendamento.MedicoId
                });
                if ((agendas != null && agendas.Count > 0 &&
                    agendas.Any(
                                a => ((
                                    (agendamento.HoraInicio >= a.HoraInicio && agendamento.HoraInicio <= a.HoraFim) ||
                                    (agendamento.HoraFim >= a.HoraInicio && agendamento.HoraFim <= a.HoraFim))) && (!a.Avaliado || a.Aprovado))))
                {
                    alert.Add("conflitoHorario", "Já existe uma consuta agendada para o médico selecionado no período selecionado");
                }
                if (alert.HasMessage)
                    return;
                if (agendamento.Salvar())
                {
                    //alert.Add("sucesso", "Item salvo com sucesso");
                    this.PacienteId.Text = string.Empty;
                    this.MedicoId.SelectedValue = "0";
                    this.DataConsulta.Text = string.Empty;
                    this.Cpf.Text = string.Empty;
                    this.Nome.Text = string.Empty;
                    sucesso = true;
                }
                else
                {
                    alert.Add("falhaSalvar", "Falha ao salvar o item");
                }
            }
            catch (Exception ex)
            {
                alert.Add("exception", ex.Message.Replace('\'', ' ').Replace("\r\n", "<br />"));
            }
            finally
            {
                if (alert.HasMessage)
                    alert.Show();
                else
                {
                    Session["op"] = "s";
                    this.ClientScript.RegisterStartupScript(this.GetType(), "error", "window.location='" + EFramework.Web.UrlBase.UrlPadrao + "Views/Cadastros/Agenda.aspx" + "'", true);
                }
            }
        }

        [WebMethod]
        public static List<RzCorportativo.Lib.Medico> GetMedicos(int especialidadeId)
        {
            return RzCorportativo.Lib.Medico.Listar(new RzCorportativo.Lib.Medico() { Especialidade = (short)especialidadeId});
        }

        [WebMethod]
        public static RzCorportativo.Lib.Usuario GetPaciente(string cpf)
        {
            if(string.IsNullOrWhiteSpace(cpf))
                return null;
            var paciente = RzCorportativo.Lib.Usuario.Listar(new RzCorportativo.Lib.Usuario() { Cpf = EFramework.Web.Configuration.MaskConfiguration.RemoveMask(cpf, "cpfKeyDel") }).FirstOrDefault();
            if (paciente == null)
                return null;
            return paciente;
        }

        [WebMethod]
        public static object GetCustomPaciente(string cpf)
        {
            if (string.IsNullOrWhiteSpace(cpf))
                return null;
            var paciente = RzCorportativo.Lib.Usuario.Listar(new RzCorportativo.Lib.Usuario() { Cpf = EFramework.Web.Configuration.MaskConfiguration.RemoveMask(cpf, "cpfKeyDel") }).FirstOrDefault();
            if (paciente == null)
                return null;
            return new
            {
                Ativo = paciente.Ativo,
                Cpf = paciente.Cpf,
                Email = paciente.Email,
                Nome = paciente.Nome,
                PacienteId = paciente.UsuarioId,
                Sexo = paciente.Sexo,
                Telefone = paciente.Telefone,
                DataNascimento = new
                {
                    Day = paciente.DataNascimento.Day,
                    Month = paciente.DataNascimento.Month,
                    Year = paciente.DataNascimento.Year
                }
            };
        }
    }
}